/***************************************************************************************************
 *Copyright(C),2010-2016,Sumscope
 *FileName	:  Convert.h
 *Author	:  scofined.qi
 *Version	:  1.0
 *Date		:  2015/03/25
 *Desc		:  //用于主要说明此程序文件完成的主要功能
 *Relation :
 *Others	:  //其他内容说明
 *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
 *History	:
 * //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
 ***************************************************************************************************/
#pragma once

#include <vector>

#include "../core.h"
#include "BaseString.h"
#include "WideString.h"
#include "simple_array.h"

namespace qb {
namespace base {
using namespace std;
class S_CORE_EXPORT CConvertFast {  // 单线程版本
  typedef SimpleArray<char> CharBuf;
  typedef SimpleArray<wchar_t> WideBuf;
  CharBuf* m_str;
  WideBuf* m_wstr;
  int m_str_len;
  int m_wstr_len;

 public:
  CConvertFast();
  ~CConvertFast();
  const char* ToUtf8(const char* gb2312, int len = -1);  // gbk ==>utf8
  const wchar_t* ToWide(const char* gbk, int len);       // gbk ==>wide

  const char* ToUtf8(const wchar_t* wstr, int len);  // wide==>utf8
  const char* ToGbk(const wchar_t* wstr, int len);   // wide==>gbk

  const char* ToGbk(const char* utf8, int inlen = -1);    // utf8==>gbk
  const char* ToGbkEx(const char* utf8, int inlen = -1);  // utf8==>gbk
  const wchar_t* UToWide(const char* utf8, int len);      // utf8==>wide

  const char* ToGbkTruncate(int capcity, const char* utf8, int inlen,
                            bool comma = false);

  int GetWstrSize() const { return m_wstr_len; }
  int GetStrSize() const { return m_str_len; }
  int GetWstrSize(const char* gbk, int len);
  int GetStrSize(const wchar_t* pwstr, int len);
};
S_CORE_EXPORT bool FastToWideString(const char* buffer, WideString& szRet);
//////////////////////////////////////////////////////////////////////////
// 多线程版本
S_CORE_EXPORT BaseString G2U(const BaseString& gb2312);
S_CORE_EXPORT BaseString G2UT(const BaseString& gbk);
S_CORE_EXPORT BaseString U2G(const BaseString& utf8);
S_CORE_EXPORT BaseString U2GT(const BaseString& utf8);
S_CORE_EXPORT BaseString G2J(const BaseString& str);  // gbk->json
S_CORE_EXPORT BaseString J2G(const BaseString& str);  // json->gbk

S_CORE_EXPORT BaseString W2U(const wchar_t* pwstr, int len = -1);
S_CORE_EXPORT WideString U2W(const char* utf8, int len = -1);

S_CORE_EXPORT WideString G2W(const char* gbk, int len = -1);
S_CORE_EXPORT BaseString W2G(const wchar_t* pwstr, int len = -1);
S_CORE_EXPORT int W2GSize(const wchar_t* pwstr, int len = -1);
S_CORE_EXPORT int G2WSize(const wchar_t* pwstr, int len = -1);
S_CORE_EXPORT void G2WC(const char* gbk, wchar_t& wc);
S_CORE_EXPORT void W2GC(const wchar_t& wc, char* gbk);
//////////////////////////////////////////////////////////////////////////

std::vector<BaseString>& U2G(std::vector<BaseString>& utf8);
std::vector<std::pair<BaseString, double>>& U2G(
    std::vector<std::pair<BaseString, double>>& utf8);
std::vector<std::pair<BaseString, BaseString>>& U2G(
    std::vector<std::pair<BaseString, BaseString>>& utf8);

}  // namespace base
}  // namespace qb
